# 单继承
# class User:
#     def __init__(self, name):
#         self.__name = name
#         self.age = 20  # 公开的实例属性
#     def set_name(self, name):
#         self.__name = name  # 添加一个私有的实例属性
#     def get_name(self):
#         return self.__name  # 在类中访问私有属性
#     def to_string(self):
#         return f'name: {self.__name}\n'
#
# # 继承父类User
# class Student(User):
#     # pass  # 占位符，处理缩进问题
#     def set_sex(self, sex):
#         self.__sex = sex
#     def get_sex(self):
#         return self.__sex
#     # 重写：子类覆盖父类中相同的方法，重写方法逻辑
#     def to_string(self):
#         # 父类的__name是私有的，所以在子类中需要通过公开方法来获取
#         # 父类的age属性是公开的，可以直接访问
#         return f'name: {self.get_name()}\nage: {self.age}\nsex:{self.__sex}'
#
# student = Student('小李')  # 调用了父类的构造方法
# # print(student.to_string())  # 继承了父类公开的to_string方法
# # print(student.age)  # 访问父类中的公开属性
# # print(student.__name)  # 不能访问父类中的私有属性
# student.set_sex('男')
# print(student.get_sex())
# print(student.to_string())

# 多继承
class Fu1:
    def fun1(self):
        print('父类1中的方法1')
    def fun2(self):
        print('父类1中的方法2')
    def test(self):
        print('父类1中的test方法')

class Fu2:
    def fun1(self):
        print('父类2中的方法1')
    def fun3(self):
        print('父类2中的方法3')
    def test(self):
        print('父类2中的test方法')

class Zi(Fu1, Fu2):
    def test(self):
        super().test()  # 调用父类的test方法，第一个父类>第二个父类
        print('子类中的test方法')
zi = Zi()
zi.fun1()  # 执行前面父类的方法
zi.fun2()
zi.fun3()
zi.test()  # 取最近的，子类>第一个父类>第二个父类>...